import axios from 'axios'

// 服务名与baseURL映射
const SERVICE_BASE_URLS = {
  //rbac: 'http://localhost:5271',
  //auth: 'http://localhost:5046',
  //pregnancy: 'http://localhost:5109' // 图片中显示的是localhost:5109端口
  
  pregnancy: 'http://39.96.200.62:8411',
  rbac: 'ohttp://39.96.200.62:8080',//写
  auth: 'http://39.96.200.62:8311'//读
}

// 处理响应中的DBNull值，避免类型转换错误
const handleDBNullValues = (data: any): any => {
  if (data === null || data === undefined) {
    return '';
  }
  
  // 如果是字符串且包含DBNull，返回空字符串
  if (typeof data === 'string' && data.includes('DBNull')) {
    return '';
  }
  
  // 处理对象
  if (typeof data === 'object' && data !== null) {
    if (Array.isArray(data)) {
      // 处理数组
      return data.map(item => handleDBNullValues(item));
    } else {
      // 处理普通对象
      const result: Record<string, any> = {};
      for (const key in data) {
        if (Object.prototype.hasOwnProperty.call(data, key)) {
          result[key] = handleDBNullValues(data[key]);
        }
      }
      return result;
    }
  }
  
  return data;
};

// 创建axios实例
const service = axios.create({
  timeout: 10000 // 超时时间，可根据需要调整
})

// 请求拦截器，自动携带Token
service.interceptors.request.use(
  config => {
    const token = localStorage.getItem('Token') || localStorage.getItem('token')
    if (token) {
      config.headers = config.headers || {}
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => Promise.reject(error)
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 处理响应中可能存在的DBNull值，避免前端出现类型转换错误
    if (response.data) {
      response.data = handleDBNullValues(response.data);
    }
    
    // 如果响应成功，直接返回数据
    return response;
  },
  error => {
    // 处理错误响应
    if (error.response) {
      // 处理响应中可能存在的DBNull值
      if (error.response.data) {
        error.response.data = handleDBNullValues(error.response.data);
      }
      
      const status = error.response.status;
      
      if (status === 401) {
        // 清除本地Token
        localStorage.removeItem('Token');
        localStorage.removeItem('token');
        // 跳转到登录页
        window.location.href = '/login';
      } else if (status === 400) {
        console.error('请求参数错误:', error.response.data);
      } else if (status === 404) {
        console.error('请求的资源不存在');
      } else if (status === 500) {
        console.error('服务器内部错误');
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      console.error('网络错误，无法连接到服务器');
    } else {
      // 请求配置有误
      console.error('请求配置错误:', error.message);
    }
    
    return Promise.reject(error);
  }
)

// 通用请求方法，支持serviceName
export function apiRequest(options: {
  url: string,
  method?: 'get' | 'post' | 'put' | 'delete',
  data?: any,
  params?: any,
  baseURL?: string,
  serviceName?: keyof typeof SERVICE_BASE_URLS
}) {
  const baseURL = options.baseURL || (options.serviceName ? SERVICE_BASE_URLS[options.serviceName] : undefined)
  return service({
    url: options.url,
    method: options.method || 'get',
    data: options.method === 'get' ? undefined : options.data,
    params: options.method === 'get' ? options.params || options.data : options.params,
    baseURL
  })
}

export default service 